Journal d'un Terrien

Web log de Serge Boisse

On line depuis 1992 !

Publicité
Si cette page vous a plu, Copiez son adresse et partagez-la !
http://sboisse.free.fr/programmation/Algorithmes/compression au fil de l_eau.php
Savez-vous quels sont les articles les plus vendus sur Amazon.fr ?
compression au fil de l'eau

compression au fil de l'eau

Auteur : Serge Boisse

Objectif :

Etant donné une séquence ou un flux de symboles (incoming stream), , dont les symboles appartiennent à un alphabet fini, par exemple {0,1} ou {a,b,c,d}, etc, et pour laquelle on dispose déjà d'une description compressée, déterminer un moyen de calculer la nouvelle description minimale de la nouvelle séquence de symboles lors qu'un nouveau symbole a été reçu.

On s'intéresse ici uniquement aux compressions par détection de répétitions.

Essayons de voir ce qui se passe quand on rajoute un symbole à une chaine déjà compressée :

Notations

On utilisera ici la syntaxe "latex", pour les répétitions, c'est à dire que par exemple la séquence =101011101011 sera compressée par ((10)^{2}1^{2})^{2}, soit en latex
Les '()' peuvent être omises s'il s'agit de la répétition d'un symbole unique : peut s'écrire 1^2 ou (1)^2. De même

Soit la initiale séquence de symboles, non compressée.
Soit la séquence compressée déjà connue au format latex, genre (ab^{n})^{m}, et le nouveau symbole.

Dans ce document, nous nous aurons besoin d'une syntaxe pour comprendre cet algorithme :

  • Les lettres minuscules a,b,c,d désignent des symboles uniques
  • s est le symbole qu'on veut ajouter
  • n, m, p, q sont des entiers positifs
  • les majuscules *X,Y,Z désignent n'importe quelle sous-chaine compressée éventuellement vide, de format latex valide
  • les majuscules A,B,C sont des sous-chaines compressées non vides valides dont l'expansion ne se termine pas par s
  • F est un filtre (voirci-dessous)

Règles de réécriture

On utilisera des règles de réécriture de la forme par exemple , ou

Définition

Un filtre est une chaine de symboles au format latex qui pourra être utilisé pour matcher la séquence compressée supposée déjà connue. Le filtre peut comporter des exposants non numériques,
Par exemple le filtre peut matcher "aaa" avec dans ce cas

Une règle aura la forme sera un filtre, et est la séquence compressée résultant de l'ajout de à la séquence matchée par .

Ces règles seront applicables si elles matchent au moins une partie finale de S,

autrement dit pour toute règle de la liste ci-dessous, qui sont de la forme , il y aura aussi une autre règle "implicite" X^ est la partie (au début) de qi n'aura pas été matchée par la règle.
exception : La règle "par défaut" est unique, autrement dit il n'y aura pas de règle , qui serait d'ailleurs impossible à appliquer (où "couper" entre X et A ?).

appliquer une règle

Pour appliquer une règle à , on cherche si la règle matche une partie (finale) de , et on applique la règle en remplaçant toutes les variables par leur valeur littérale (une sous chaine non compressée) déduite du filtre de la règle, et les variables par leur valeur.

Par exemple pour appliquer la règle à la chaîne compressée (c'est à dire littéralement "bbaabba"), et à laquelle on veut ajouter "a", on déduit de la règle : = "a" et , et on obtient "" c'est à dire littéralement "bbaabbaa".

Note

Dans certains cas, plusieurs règles seront applicables.
On retiendra celle ou celles qui matchent la sous-chaine finale la plus longue.
Ensuite, parmi leurs résultats, on retiendra celui qui donne la chaine de plus faible complexité (s'il y en a plusieurs, on choisit au hasard ou la première).

En effet une mème séquence peut avoir plusieurs interpretations lorsqu'on y ajoute le symbole . Ainsi "ababab"+"a" peut donner , mais aussi , qui ont même complexité.

Mais est meilleure parce qu'elle compresse une partie de plus proche de l'origine.

Question

Existe-t-il une liste finie de règles permettant de traiter tous les cas ?

Je pense que oui parce que au fur et a mesure qu'on ajoute des règles, il devient de plus en plus difficile d'en trouver une qui ne soit pas un sous-cas d'une autre.
Par exemple je voulais ajouter mais en fait c'est déjà pris en compte par (le de cette règle est de la première)
En fait, on n'a jamais besoin des suites de symboles ,ni de , ni non plus des symboles . On n'a besoin que de et !

Essayons de bâtir cette liste :

règles

Si la chaîne se termine par (sans exposant)
11.
12. inutile, A est implicite.
13. idem, est implicite
14.
15.
16.
17.

cas particulier, est-il mieux que ? Non.

Sinon si se termine par

  1. FAUX

Sinon si S se termine par une chaîne dont le dernier symbole après expansion est :

en fait il n'y a pas de règles "intéressante" dans ce cas. En effet, se termine forcément par ou ou
Mais

  • ne simplifie rien
  • et idem,
  • idem

Sinon le dernier symbole de , même après expansion, n'est pas :

donc se finit par ou ou

  1. inutile sous-cas de la précédente
  2. en dernier ressort

Le programme : cf. ci-dessous algorithme incrémental

Exemple : #TBC

11101101110110110110
1+1 -> 1^{2}                   (11)
1^{2} => 1^{3}                 (21)
1^3+0 =>1^{3}0                 (11)  
1^{3}0+1 =>1^{3}01             (11)      
1^{3}01+1 => 1^{3}01^{2}       (12)
1^{3}01^{2}+0 => 1(1^{2}0)^2     (42)
1(1^{2}0)^{2}+1 => 1(1^{2}0)^{2}1  (11)

algorithme incrémental

Il s'agit, à partir d'une séquence déjà compressée à laquelle on ajouterait un nouveau symbole, de calculer la nouvelle séquence compressée.

Pour simplifier le programme on imposera que soit écrit s^{n} et si X a plus d'un symbole, sera écrit (X)^{n}

programme ci-dessous pas fini

Entrer une séquence initiale déjà compressée (comme 1^{2}), et un nouveau symbole (comme 1) . Le programme essaye de compresser la nouvelle chaine obtenue


page créée le 18/03/2025 à 15:09
modifiée le 17/03/2025 à 11:32
Publicité
Commentaires

Commentaires (0) :

Page :



Ajouter un commentaire (pas besoin de s'enregistrer)

Pseudo :
Message :


image de protection
En cliquant sur le bouton "Envoyer" vous acceptez les conditions suivantes : Ne pas poster de message injurieux, obscène ou contraire à la loi, ni de liens vers de tels sites. Respecter la "netiquette", ne pas usurper le pseudo d'une autre personne, respecter les posts faits par les autres. L'auteur du site se réserve le droit de supprimer un ou plusieurs posts à tout moment. Merci !
Ah oui : le bbcode et le html genre <br>, <a href=...>, <b>b etc. ne fonctionnent pas dans les commentaires. C'est voulu.
< Retour en haut de la page